package Modelo;
import java.util.*;

public class Juego {
	private Jugador jugador;
	private Mapa mapa;
	
	private int nroDeTurno;
	private int valorImpuesto;

	
	public Juego(){
		this.mapa = new Mapa();	
		this.mapa.cargarMapa();
		this.jugador = new Jugador("Andres",5000);
		this.jugador.asignarMapa(this.mapa);
		this.nroDeTurno = 1;
		this.valorImpuesto = 10;
	}
	
	public Juego(String nombre, NivelDeJuego nivel, String directorioMapa){
		this.mapa = new Mapa();
		this.mapa.cargarMapa(directorioMapa);
		float dinero = 0;
		if(nivel == NivelDeJuego.FACIL)
			dinero = 10000;
		if(nivel == NivelDeJuego.MEDIO)
			dinero = 5000;
		if(nivel == NivelDeJuego.DIFICIL)
			dinero = 2000;
		
		
		this.jugador = new Jugador(nombre,dinero);
		this.jugador.asignarMapa(this.mapa);
		this.nroDeTurno = 1;
		this.valorImpuesto = 10;
	}
	
	public void incrementarTurno(){
		this.nroDeTurno++;
	}
	
	public void nuevoJugador(Jugador jugador){
		this.jugador = jugador;
	}
	
	public Mapa obtenerMapa(){
		return this.mapa;
	}
	
	public Jugador obtenerJugador(){
		return this.jugador;
	}
	
	
	
	public CatastrofeIdentificador vivir(){
		
		this.incrementarTurno();
		this.mapa.actualizarEstadoAnteriorConstrucciones();
		//Si hay al menos una estacion de bomberos creada ejecuta reparaciones
		if(this.mapa.tieneAlMenosUnaEstacionDeBomberos()){
			
			ArrayList<Hectarea> hectareas = this.mapa.obtenerHectareasConEstacionesDeBomberos();
		
			
			
			for(int i=0;i< this.mapa.obtenerHectareasConEstacionesDeBomberos().size();i++){
				//Se aplica reconstruccion
				Hectarea hectareaConBomberosActual = hectareas.get(i);
				ArrayList<Hectarea> hectareasAledaniasEnRadioTres = this.mapa.obtenerHectareasAledanias(hectareaConBomberosActual,3);
				EstacionDeBomberos estacion = (EstacionDeBomberos)hectareaConBomberosActual.obtenerSuperficie().obtenerConstruccion();
				
				for(int j=0;j<hectareasAledaniasEnRadioTres.size();j++){
					Hectarea hectareaActual  = hectareasAledaniasEnRadioTres.get(j);
					
					if(hectareaActual.obtenerSuperficie().tieneConstruccion()){
						Construccion construccion = hectareaActual.obtenerSuperficie().obtenerConstruccion();							
						estacion.aplicarReconstruccionA(construccion);
					}
				}
			}
		}
		
		//Genera un numero random
		
		int minimo = -10;
		int maximo = 10;

		Random random = new Random();
		int numeroRandom = random.nextInt(maximo - minimo + 1) + minimo;
		
		//Utiliza random para decidir si aplica catastrofe
		if(numeroRandom < -5){
			CatastrofeIdentificador id = this.iniciarCatastrofe(numeroRandom);
			this.actualizarPoblacionYConstrucciones();
			this.cobrarImpuestos();
			return id;
			
		}else{
			this.mapa.borrarUltimasHectareasAfectadas();
			this.mapa.limpiarConstruccionesDestruidas();
			this.cobrarImpuestos();
			return null;
		}
			
	}
	
	private void actualizarPoblacionYConstrucciones(){
		this.mapa.cargarConstruccionesDestruidas();
		this.obtenerJugador().modificarPoblacion(this.mapa.obtenerPoblacionActual());
		
	}
	
	private void cobrarImpuestos() {
		if(this.nroDeTurno > 5){
			this.jugador.aumentarDinero(this.valorImpuesto*this.jugador.obtenerPoblacion());
		}
		
	}

	public CatastrofeIdentificador iniciarCatastrofe(int numeroRandom){
		double anchoMinimo = 0;
		double anchoMaximo = this.mapa.obtenerAncho();
		double altoMinimo = 0;
		double altoMaximo = this.mapa.obtenerAlto();

		Random catastrofeRandom = new Random();
		
		int xRandom = (int)(catastrofeRandom.nextDouble()*anchoMaximo + anchoMinimo);
		int yRandom = (int)(catastrofeRandom.nextDouble()*altoMaximo + altoMinimo);

		if(numeroRandom % 2 == 0){
			
			return (this.mapa.aplicarTerremoto(xRandom, yRandom));
		}else{
			return (this.mapa.aplicarGodzilla(xRandom,yRandom));
		}
	}
	
	protected ArrayList<EstacionDeBomberos> obtenerEstacionesDeBomberos(ArrayList<Hectarea> hectareasConEstacionesDeBomberos){
		
		ArrayList<EstacionDeBomberos> estacionesDeBomberos= new ArrayList<EstacionDeBomberos>();
		
		for(int i=0;i> hectareasConEstacionesDeBomberos.size();i++){
			estacionesDeBomberos.add((EstacionDeBomberos)hectareasConEstacionesDeBomberos.get(i).obtenerSuperficie().obtenerConstruccion());
		}
		return estacionesDeBomberos;
	}

	public int obtenerTurno() {
		
		return this.nroDeTurno;
	}
}
